class_name Stats
extends Resource

signal stats_changed

@export var max_health := 1
@export var art: Texture

var health: int : set = set_health
var block: int : set = set_block

# 使用组合模式 - 状态追踪器
var stats_tracker: StatsTracker

func _init():
	stats_tracker = StatsTracker.new()
	# 连接追踪器信号（可选）
	if stats_tracker:
		stats_tracker.stats_tracked.connect(_on_stats_tracked)

# 状态追踪信号处理
func _on_stats_tracked(tracker_name: String, event_type: String, data: Dictionary) -> void:
	# 可以在这里处理追踪事件，比如触发特殊效果
	pass

#设置血量
func set_health(value : int) -> void:
	var old_health = health
	health = clampi(value, 0, max_health)
	
	# 通过追踪器记录变化
	if stats_tracker:
		stats_tracker.track_health_change(old_health, health)
	
	stats_changed.emit()

#设置护甲
func set_block(value : int) -> void:
	var old_block = block
	block = clampi(value, 0, 999)
	
	# 通过追踪器记录变化
	if stats_tracker:
		stats_tracker.track_block_change(old_block, block)
	
	stats_changed.emit()

#计算伤害
func take_damage(damage : int) -> void:
	if damage <= 0:
		return
		
	var initial_damage = damage
	var damage_to_health = clampi(damage - block, 0, damage)
	var damage_to_block = clampi(initial_damage, 0, block)
	
	# 通过追踪器记录伤害事件
	if stats_tracker:
		stats_tracker.track_damage_taken(initial_damage, damage_to_health, damage_to_block)
	
	# 应用伤害
	block = clampi(block - initial_damage, 0, block)
	health -= damage_to_health

#回血
func heal(amount : int) -> void:
	if amount <= 0:
		return
	
	var old_health = health
	health += amount
	
	# 通过追踪器记录变化（在set_health中已经记录了）
	# 这里不需要额外调用，因为health的setter会自动处理

# 获得护盾
func gain_block(amount: int) -> void:
	if amount <= 0:
		return
	
	block += amount
	# 通过追踪器记录变化（在set_block中已经记录了）

# 重置回合计数器（回合开始时调用）
func reset_turn_counters() -> void:
	if stats_tracker:
		stats_tracker.reset_turn_trackers()

# 获取追踪器（供外部访问）
func get_stats_tracker() -> StatsTracker:
	return stats_tracker

# 向后兼容的接口
func get_turn_counter() -> TurnCounter:
	if stats_tracker:
		return stats_tracker.get_turn_counter()
	return null

func get_combat_tracker() -> CombatTracker:
	if stats_tracker:
		return stats_tracker.get_combat_tracker()
	return null

func get_resource_tracker() -> ResourceTracker:
	if stats_tracker:
		return stats_tracker.get_resource_tracker()
	return null

# 检查条件的便捷方法
func check_condition(tracker_type: String, condition_data: Dictionary) -> bool:
	if stats_tracker:
		return stats_tracker.check_condition(tracker_type, condition_data)
	return false

# 调试方法
func print_all_stats() -> void:
	print("📊 === 角色状态 ===")
	print("  血量: %d/%d" % [health, max_health])
	print("  护盾: %d" % block)
	if stats_tracker:
		stats_tracker.print_all_trackers()
	print("📊 ================")

#创建敌人的副本，防止有多个重复的敌人出现，却共享一个敌人实例的情况，这样会导致敌人会一起扣血
func create_instance() -> Resource:
	var instance: Stats = self.duplicate()
	instance.health = max_health
	instance.block = 0
	instance.stats_tracker = StatsTracker.new()
	return instance
